1、删除链表的重复节点
思想：就是双指针，加上创建一个头节点，
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
           if(pHead==nullptr)
               return pHead;
        ListNode* head=new ListNode(-1);
        head->next=pHead;
        ListNode* cur=pHead;
        ListNode* prev=head;
        while(cur)
        {
            if(cur->next&&cur->val==cur->next->val)
            {
                cur=cur->next;
                while(cur->next&&cur->val==cur->next->val)
                {
                    cur=cur->next;
                }
                cur=cur->next;
                prev->next=cur;
            }
            else
            {
                prev=cur;
                cur=cur->next;
            }
        }
        return head->next;
    }
};
2、二叉树的下一个节点：
思想：就是分析该节点有无右孩子，以及当前节点是否为其父节点的左孩子。中序遍历规则
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if(pNode==nullptr)
            return pNode;
        //if有右孩子，那么其下一个节点为右孩子的最左节点
        if(pNode->right)
        {
            TreeLinkNode* p=pNode->right;
            TreeLinkNode* cur=p;
            while(p)
            {
                cur=p;
                p=p->left;
            }
            return cur;
        }
        //无右孩子,那么就是找父节点，其中父节点应该满足p->left=pNode
        while(pNode->next)
        {
            TreeLinkNode* p =pNode->next;
            if(p->left==pNode)
                return p;
            pNode=pNode->next;
        }
        return nullptr;
    }
};